#!/usr/bin/env node

// 小车控制测试脚本
const { exec } = require('child_process');
const { promisify } = require('util');
const execAsync = promisify(exec);

console.log("🚗 小车控制测试...");

async function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

// 初始化GPIO引脚
async function initPins() {
  try {
    await execAsync('sudo gpio -g mode 12 out');
    await execAsync('sudo gpio -g mode 13 out');
    console.log("✅ 引脚12和13初始化为输出模式");
    return true;
  } catch (error) {
    console.error("❌ 引脚初始化失败:", error.message);
    return false;
  }
}

// 发送PWM信号
async function sendPWM(pin, dutyCycleMs, durationMs) {
  const periodMs = 20; // 50Hz = 20ms周期
  const highTimeMs = dutyCycleMs;
  const lowTimeMs = periodMs - dutyCycleMs;
  
  const cycles = Math.floor(durationMs / periodMs);
  
  for (let i = 0; i < cycles; i++) {
    await execAsync(`sudo gpio -g write ${pin} 1`);
    await sleep(highTimeMs);
    await execAsync(`sudo gpio -g write ${pin} 0`);
    await sleep(lowTimeMs);
  }
}

// 测试电调
async function testESC() {
  console.log("\n🔧 测试电调(引脚13)...");
  
  // 发送初始化信号(中性位置)
  console.log("发送初始化信号...");
  await sendPWM(13, 1.5, 2000); // 2秒中性信号
  
  // 前进测试
  console.log("前进测试...");
  await sendPWM(13, 1.7, 1000); // 1秒前进信号
  await sendPWM(13, 1.5, 500);  // 0.5秒中性信号
  
  // 后退测试
  console.log("后退测试...");
  await sendPWM(13, 1.3, 1000); // 1秒后退信号
  await sendPWM(13, 1.5, 500);  // 0.5秒中性信号
  
  console.log("电调测试完成");
}

// 测试舵机
async function testServo() {
  console.log("\n🔧 测试舵机(引脚12)...");
  
  // 中心位置
  console.log("中心位置...");
  await sendPWM(12, 1.5, 1000);
  
  // 右转
  console.log("右转...");
  await sendPWM(12, 1.8, 1000);
  await sendPWM(12, 1.5, 500);
  
  // 左转
  console.log("左转...");
  await sendPWM(12, 1.2, 1000);
  await sendPWM(12, 1.5, 500);
  
  console.log("舵机测试完成");
}

async function main() {
  try {
    console.log("🚀 开始小车控制测试");
    
    // 初始化引脚
    const initSuccess = await initPins();
    if (!initSuccess) {
      console.error("❌ 初始化失败，退出测试");
      process.exit(1);
    }
    
    // 确保所有引脚初始为低电平
    await execAsync('sudo gpio -g write 12 0');
    await execAsync('sudo gpio -g write 13 0');
    
    // 测试电调
    await testESC();
    
    // 测试舵机
    await testServo();
    
    // 清理
    await execAsync('sudo gpio -g write 12 0');
    await execAsync('sudo gpio -g write 13 0');
    
    console.log("\n✅ 小车控制测试完成！");
    console.log("\n🔍 如果小车仍然没有反应，请检查:");
    console.log("   1. 硬件连接: 确认信号线连接到正确的GPIO引脚");
    console.log("   2. 电源供应: 电调和舵机需要独立的电源供应");
    console.log("   3. 电调校准: 某些电调需要校准才能工作");
    console.log("   4. 接地连接: 确保所有设备共地");
    
  } catch (error) {
    console.error("❌ 测试失败:", error.message);
    
    // 确保清理
    try {
      await execAsync('sudo gpio -g write 12 0');
      await execAsync('sudo gpio -g write 13 0');
    } catch (e) {}
  }
}

main();